package com.xygz.orm;

import com.xiyuan.smartutils.Systems;
import com.xygz.orm.exception.ORMException;
import com.xygz.orm.utils.S;

/**
 * ORM 工具类
 *
 * @author xiyuan-lgz 2023-10-31 @version v1.0.0 新建与整理
 */
@SuppressWarnings("all")
public final class ORM {
    private ORM() {
        // 初始化 Systems
        Systems.getJavaHome();
    }
    
    /**
     * 指定数据源ID, 获取默认数据源 DDL
     *
     * @param id 数据源名称
     * @return DDL 对象
     * @throws ORMException 异常信息
     */
    public static DDL getDDL(String id) throws ORMException {
        return get(id).getDDL();
    }
    
    
    /**
     * 获取默认数据源 DDL，如果没有指定默认数据库则去第一个数据库
     *
     * @return DDL 对象
     * @throws ORMException 异常信息
     */
    public static DDL getDDL() throws ORMException {
        return get(null).getDDL();
    }
    
    /**
     * 获取默认数据源 SQL（jdbc） 执行器， 如果没有指定默认数据库则去第一个数据库
     *
     * @return SQL SQL执行器
     * @throws ORMException 异常信息
     */
    public static SQL getSQL() throws ORMException {
        return get(null).getSQL();
    }
    
    /**
     * 指定数据源ID, 获取默认数据源 SQL（jdbc） 执行器
     *
     * @param id 数据源名称
     * @return SQL执行器
     * @throws ORMException 异常信息
     */
    public static SQL getSQL(String id) throws ORMException {
        return get(id).getSQL();
    }
    
    /**
     * 获取默认数据库  DB | DML，如果没有指定默认数据库则去第一个数据库
     *
     * @return DB 对象
     */
    public static DB db() {
        return get(null).db();
        
    }
    
    /**
     * 指定数据源ID, 获取默认数据库  DB |  DML
     *
     * @param id 数据源名称
     * @return DB 对象
     */
    public static DB db(String id) {
        return get(id).db();
    }
    
    
    private static ORMServer get(String id) {
        try {
            return S.isBlank(id) ? ORMManager.get() : ORMManager.get(id);
        }
        catch (ORMException e) {
            throw e;
        }
        catch (RuntimeException e) {
            throw e;
        }
        catch (Throwable e) {
            RuntimeException exception = new RuntimeException(e.getMessage());
            exception.setStackTrace(e.getStackTrace());
            throw exception;
        }
    }
}
